package plantilla;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.ResourceBundle;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import modelUtil.Configuracion;
import modelUtil.Util;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLPlantillaDAO extends AbstractPlantillaDAO {

	public void crearPlantilla(PlantillaTO pto, String ruta) {
		
		Configuracion.instancia().leerDoc();
		 if (pto == null) { 
			 File directorio =  new File(ruta);
			directorio.mkdir();
			 File Teclado = new File(ruta  + "//" + Configuracion.instancia().getTecladoActual()  + ".xml"); 
			 try{
			 Teclado.createNewFile();
			 }catch(Exception e){
				 
			 }
			 
		 } else {
		 

		try {
			// Create the document.
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			Document doc = null;

			try {
				DocumentBuilder builder = factory.newDocumentBuilder();
				doc = builder.newDocument();

			} catch (Exception spe) {

			}


			Element root = doc.createElement("Plantilla");
			doc.appendChild(root);


			if (pto.getNombrePlantilla() == "") {
				Util.addTextElement(doc, root, "Nombre", Configuracion.instancia().getTecladoActual());
			} else {
				Util.addTextElement(doc, root, "Nombre", pto.getNombrePlantilla());
			}

			Util.addTextElement(doc, root, "Filas", pto.getNumeroFilas());
			Util.addTextElement(doc, root, "Columnas", pto.getNumeroColumnas());
			Util.addTextElement(doc, root, "AltoTeclado", pto.getAltoTeclado());
			Util.addTextElement(doc, root, "AnchoTeclado", pto.getAnchoTeclado());
			Util.addTextElement(doc, root, "PosicionInicialTeclado", pto.getPosicionInicial());
			Util.addTextElement(doc, root, "AnteriorTeclado", pto.getAnteriorTeclado());

			// Pasamos a añadir los botones con sus propiedades
			for (BotonTO b : pto.getListaBotones()) {
				// Añadimos el boton
				Element boton = doc.createElement("Boton");
				// Añadimos las propiedades del boton
				Util.addTextElement(doc, boton, "NombreBoton", b.getNombreBoton());
				Util.addTextElement(doc, boton, "TextoBoton", b.getTextoBoton());
				Util.addTextElement(doc, boton, "NombreFuente", b.getNombreFuente());
				Util.addTextElement(doc, boton, "TamanoFuente", b.getTamanoFuente());
				Util.addTextElement(doc, boton, "EstiloFuente", b.getEstiloFuente());
				Util.addTextElement(doc, boton, "NombreColorFuente", b.getNombreColorFuente());
				Util.addTextElement(doc, boton, "NombreColorFondo", b.getNombreColorFondo());
				Util.addTextElement(doc, boton, "TextAlign", b.getTextAlign());
				Util.addTextElement(doc, boton, "NombreIconoFichero", b.getNombreIconoFichero());
				Util.addTextElement(doc, boton, "NombreBackGroundImageFichero", b.getNombreBackGroundImageFichero());
				Util.addTextElement(doc, boton, "ImageAlign", b.getImageAlign());
				Util.addTextElement(doc, boton, "FlatStyle", b.getFlatStyle());
				Util.addTextElement(doc, boton, "NombreColorBorde", b.getNombreColorBorde());
				Util.addTextElement(doc, boton, "NombreColorMouseOver", b.getNombreColorMouseOver());
				Util.addTextElement(doc, boton, "NombreColorMouseDown", b.getNombreColorMouseDown());
				Util.addTextElement(doc, boton, "BorderSize", b.getBorderSize());
				Util.addTextElement(doc, boton, "FilasOcupa", b.getFilasOcupa());
				Util.addTextElement(doc, boton, "ColumnasOcupa", b.getColumnasOcupa());

				if (b.getAccionEjecutar().size() == 0) {
					Element accion = doc.createElement("Accion");
					Util.addTextElement(doc, accion, "GrupoAccion", "");
					Util.addTextElement(doc, accion, "AccionConcreta", "");
					Util.addTextElement(doc, accion, "ArgumentoAccion", "");
					boton.appendChild(accion);
				} else {
					for (AccionBotonTO abTO : b.getAccionEjecutar()) {
						Element accion = doc.createElement("Accion");
						Util.addTextElement(doc, accion, "GrupoAccion", abTO.getGrupoAccion());
						Util.addTextElement(doc, accion, "AccionConcreta", abTO.getAccionConcreta());
						Util.addTextElement(doc, accion, "ArgumentoAccion",	abTO.getArgumentoAccion());
						boton.appendChild(accion);

					}
				}
				Util.addTextElement(doc, boton, "BotonValido", b.getBotonValido());
				Util.addTextElement(doc, boton, "PosicionFila", b.getPosicionFila());
				Util.addTextElement(doc, boton, "PosicionColumna", b.getPosicionColumna());
				Util.addTextElement(doc, boton, "SiguienteTeclado", b.getSiguienteTeclado());
				Util.addTextElement(doc, boton, "TiempoBarrido", b.getTiempoBarrido());
				// Propiedades de accesibilidad
				Util.addTextElement(doc, boton, "AccesibleName", b.getAccesibleName());
				Util.addTextElement(doc, boton, "AccesibleDescription", b.getAccesibleDescription());
				root.appendChild(boton);
			}
			Util.guardarXML(doc, ruta + "//" + Configuracion.instancia().getTecladoActual() + ".xml");

		} catch (Exception ex) {
			Util.popup(0,ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_guardar_teclado"));
		}
	 }

	}

	public PlantillaTO buscarPlantilla(String ruta) {


		PlantillaTO devolver = new PlantillaTO();
		List <BotonTO> listaBotones = devolver.getListaBotones();
		Configuracion.instancia().leerDoc();
		try {
			// Create the document.

			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			Document doc = null;

			try {
				DocumentBuilder builder = factory.newDocumentBuilder();
				doc = builder.parse(ruta + "//" + Configuracion.instancia().getTecladoActual()
						+ ".xml");

			} catch (Exception spe) {

			}

			Node nodoNombre = doc.getElementsByTagName("Nombre").item(0);
			devolver.setNombrePlantilla(nodoNombre.getTextContent());

			Node nodoFilas = doc.getElementsByTagName("Filas").item(0);
			devolver.setNumeroFilas(nodoFilas.getTextContent());

			Node nodoColumnas = doc.getElementsByTagName("Columnas").item(0);
			devolver.setNumeroColumnas(nodoColumnas.getTextContent());

			Node nodoAltoTeclado = doc.getElementsByTagName("AltoTeclado")
					.item(0);
			devolver.setAltoTeclado(nodoAltoTeclado.getTextContent());

			Node nodoAnchoTeclado = doc.getElementsByTagName("AnchoTeclado")
					.item(0);
			devolver.setAnchoTeclado(nodoAnchoTeclado.getTextContent());

			Node nodoPosicionInicialTeclado = doc.getElementsByTagName(
					"PosicionInicialTeclado").item(0);
			devolver.setPosicionInicial(nodoPosicionInicialTeclado
					.getTextContent());

			Node nodoAnteriorTeclado = doc.getElementsByTagName(
					"AnteriorTeclado").item(0);
			devolver.setAnteriorTeclado(nodoAnteriorTeclado.getTextContent());

			// se crea el navegador para acceder al XML

			NodeList iterator = doc.getElementsByTagName("Boton");

			/*
			 * Node nodoAux = iterator.item(0); Node nodoPadre =
			 * nodoAux.getParentNode();
			 * 
			 * iterator = nodoPadre.getChildNodes();
			 */

			// un iterador para acceder a los productos del XML

			for (int i = 0; i < iterator.getLength(); i++) {
				Node nodo = iterator.item(i);
				// iterator.Current.MoveToFirstChild();
				if (nodo instanceof Element) {
					BotonTO bto = new BotonTO();

					// Cogemos el primer elemento
					NodeList nodosBoton = nodo.getChildNodes();

					for (int k = 0; k < nodosBoton.getLength(); k++) {

						Node nodoAux = nodosBoton.item(k);
						if (nodoAux instanceof Element) {

							if (nodoAux.getNodeName().equals("NombreBoton")) {

								bto.setNombreBoton(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("TextoBoton")) {

								bto.setTextoBoton(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreFuente")) {

								bto.setNombreFuente(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("TamanoFuente")) {

								bto.setTamanoFuente(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("EstiloFuente")) {

								bto.setEstiloFuente(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreColorFuente")) {

								bto.setNombreColorFuente(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreColorFondo")) {

								bto.setNombreColorFondo(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("TextAlign")) {

								bto.setTextAlign(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreIconoFichero")) {

								bto.setNombreIconoFichero(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreBackGroundImageFichero")) {

								bto.setNombreBackGroundImageFichero(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("ImageAlign")) {

								bto.setImageAlign(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("FlatStyle")) {

								bto.setFlatStyle(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreColorBorde")) {

								bto.setNombreColorBorde(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreColorMouseOver")) {

								bto.setNombreColorMouseOver(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("NombreColorMouseDown")) {

								bto.setNombreColorMouseDown(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("BorderSize")) {

								bto.setBorderSize(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("FilasOcupa")) {

								bto.setFilasOcupa(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("ColumnasOcupa")) {

								bto.setColumnasOcupa(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("BotonValido")) {

								bto.setBotonValido(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("PosicionFila")) {

								bto.setPosicionFila(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("PosicionColumna")) {

								bto.setPosicionColumna(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("SiguienteTeclado")) {

								bto.setSiguienteTeclado(nodoAux	.getTextContent());

							}

							if (nodoAux.getNodeName().equals("TiempoBarrido")) {

								bto.setTiempoBarrido(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("AccesibleName")) {

								bto.setAccesibleName(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("AccesibleDescription")) {

								bto.setAccesibleDescription(nodoAux.getTextContent());

							}

							if (nodoAux.getNodeName().equals("Accion")) {

								NodeList hijosAccion = nodoAux.getChildNodes();
								AccionBotonTO abto = new AccionBotonTO();

								for (int l = 0; l < hijosAccion.getLength(); l++) {

									Node nodoAccion = hijosAccion.item(l);

									if (nodoAccion instanceof Element) {

										if (nodoAccion.getNodeName().equals("GrupoAccion")) {
											
											abto.setGrupoAccion(nodoAccion.getTextContent());
										}

										if (nodoAccion.getNodeName().equals("AccionConcreta")) {
											
											abto.setAccionConcreta(nodoAccion.getTextContent());
										}

										if (nodoAccion.getNodeName().equals("ArgumentoAccion")) {
											
											abto.setArgumentoAccion(nodoAccion.getTextContent());
										}

									}
								}
								if ((abto.getGrupoAccion() != "")&& (abto.getAccionConcreta() != "")) {

									List<AccionBotonTO> lista = bto.getAccionEjecutar();
									lista.add(abto);
									bto.setAccionEjecutar(lista);
								}
							}

						}

					}
					
						listaBotones.add(bto);
				}
			}
			devolver.setListaBotones(listaBotones);
			return devolver;
		} catch (Exception ex) {
			return null;
		}

	}

	public void eliminarPlantilla(List<String> rutas) {
		String aux;
		Configuracion.instancia().leerDoc();
		try {
			for (int i = 0; i < rutas.size(); i++) {
				File directorio = new File(Configuracion.instancia().getDirUsuarioActual() + "//"
						+ rutas.get(i));
				Util.borrarDirectorio(directorio);
			}
			if (rutas.size() > 1)
				aux = ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_exito_eliminar_teclados");
			else
				aux = ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_exito_eliminar_teclado");


			Util.popup(1, aux);

		} catch (Exception e) {
			Util.popup(0,ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_eliminar_teclado"));
		}
	}

	public void moverPlantilla(String dirOrigen, String dirDestino,
			boolean sobreescribir) {
		try {
			File diSource = new File(dirOrigen);
			File diDestination = new File(dirDestino);
			Util.copyFiles(diSource, diDestination, sobreescribir);

		} catch (Exception e) {
			Util.popup(0, ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_standard"));
		}
	}

	public String getDir(File dirTeclados, String nombreTeclado) {
		try {
			try {
				// Create the document.
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				Document doc = null;

				String ruta = dirTeclados.getPath();

				for (File d : dirTeclados.listFiles()) {
					if (d.isDirectory()) {
						if (!d.getName().equals(".svn")) {
							try {
								DocumentBuilder builder = factory
										.newDocumentBuilder();
								doc = builder.parse(ruta + "//" + d.getName()
										+ "//" + d.getName() + ".xml");
								Node nodoNombre = doc.getElementsByTagName(
										"Nombre").item(0);
								if (nodoNombre.getTextContent().equals(
										nombreTeclado))
									return d.getName();
								
							} catch (FileNotFoundException fnfe) {
								continue;

							} catch (Exception xe) {
								continue;
							}
						}
					}
				}
				return "";
			} catch (Exception xe) {
				return "";
			}
		} catch (Exception xe) {
			return "";
		}

	}

	public String getName(String ruta) {
		try {
			try {
				// Create the document.
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				Document doc = null;

				try {
					File archivo = new File(ruta);
					String nombre = archivo.getName();
					DocumentBuilder builder = factory.newDocumentBuilder();
					doc = builder.parse(ruta + "//" + nombre + ".xml");

				} catch (Exception spe) {

				}
				Node nodoNombre = doc.getElementsByTagName("Nombre").item(0);
				return nodoNombre.getTextContent();

			} catch (Exception dnfe) {
				return "";
			}
		} catch (Exception dnfe) {
			return "";
		}

	}

	public boolean existePlantilla(File dirTeclados, String nombreTeclado) {

		try {

			for (File d : dirTeclados.listFiles()) {
				if (d.isDirectory()) {
					try {
						if (d.getName().equals(nombreTeclado))
							return true;
					} catch (Exception fnfe) {
						continue;

					}

				}

			}
			return false;
		} catch (Exception e) {
			return false;
		}

	}

	public String tecladoUnico(String ruta) {

		try {
			File dirTeclados = new File(ruta);
			try {

				int numTeclados = 0;
				String principal = "";

				for (File d : dirTeclados.listFiles()) {
					if (d.isDirectory()) {
						principal = d.getName();
						if (!d.getName().equals(".svn"))
							numTeclados++;

					}
				}

				if (numTeclados == 1)
					return principal;
				else
					return "ninguno";
			} catch (Exception dnfe) {
				return "";
			}
		} catch (Exception dnfe) {
			return "";
		}
	}

}
